package cl.jsoftlabs.gwt.soccer.client.ui.jugadores;

import java.util.ArrayList;
import java.util.List;

import cl.jsoftlabs.gwt.soccer.client.bean.JugadorVO;
import cl.jsoftlabs.gwt.soccer.client.mvc.events.AppEvents;
import cl.jsoftlabs.gwt.soccer.client.services.JugadorService;

import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.data.BeanModelReader;
import com.extjs.gxt.ui.client.data.ListLoadResult;
import com.extjs.gxt.ui.client.data.ListLoader;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.extjs.gxt.ui.client.widget.Status;

public class GridJugadores extends LayoutContainer {

	public static final String ITEM_ID = "grid-jugadores";
	Button actualizarGridButton;
	Button saludarButton;
	
	JugadorVO jugador;
	
	private AsyncCallback<String> callbackFind = new AsyncCallback<String>() {

		@Override
		public void onSuccess(String result) {
			Info.display("Busqueda", result);
		}

		@Override
		public void onFailure(Throwable caught) {
			Info.display("Busqueda", "Mal");
		}
	};
	
	private ButtonBar buttonBar;
	private Button btnNuevo;
	private Button btnEliminar;
	private Button btnModificar;
	private Button btnNuevoContrato;
	private Status status;
	private ContentPanel cp;
	private Grid<BeanModel> grid;
	
	public GridJugadores(){
		super();
		setItemId(ITEM_ID);
		cp = new ContentPanel();  
		jugador = new JugadorVO();
		actualizarGridButton = new Button("Refrescar Tabla");
		saludarButton = new Button("Saludar");
		buttonBar = new ButtonBar();
		btnNuevo = new Button("Nuevo");
		btnEliminar = new Button("Eliminar");
		btnModificar = new Button("Modificar");
		btnNuevoContrato = new Button("Nuevo Contrato");
		status = new Status();
		btnNuevoContrato.addSelectionListener(new SelectionListener<ButtonEvent>() {
			@Override
			public void componentSelected(ButtonEvent ce) {
				Dispatcher.forwardEvent(AppEvents.NuevoContrato, jugador);				
			}
		});
	}

	@Override
	protected void onRender(Element parent, int index) {
		super.onRender(parent, index);
		  
	    cp.setHeading("Jugadores");  
	    cp.setFrame(true);  
	    cp.setSize(600, 500);

		buildGrid();
		
		status.setIconStyle("face-monkey");	
	

		
  
	    actualizarGridButton.addSelectionListener(new SelectionListener<ButtonEvent>() {
			@Override
			public void componentSelected(ButtonEvent ce) {
				
			}
		});
	    
	    saludarButton.addSelectionListener(new SelectionListener<ButtonEvent>() {
			
			@Override
			public void componentSelected(ButtonEvent ce) {
				JugadorService.Util.getInstance().saludar(jugador.getNombres(), callbackFind);				
			}
		});
	    cp.setLayout(new FitLayout());
	    
	    cp.add(grid);
	    grid.setWidth("30px");
	    cp.addButton(actualizarGridButton);
	    cp.addButton(saludarButton);
	    cp.setCollapsible(true);
	    btnNuevo.setIconStyle("add");
	    
	    buttonBar.add(btnNuevo);
	    btnModificar.setIconStyle("edit");
	    
	    buttonBar.add(btnModificar);
	    
	    buttonBar.add(btnNuevoContrato);
	    btnEliminar.setIconStyle("delete");
	    
	    buttonBar.add(btnEliminar);
	    
	    cp.setTopComponent(buttonBar);
	    
	    cp.setBottomComponent(status);
 
	    add(cp); 
	    cp.setSize("600", "500");

	}

	private void buildGrid() {
		// proxy and reader
		RpcProxy<List<JugadorVO>> proxy = new RpcProxy<List<JugadorVO>>() {
			@Override
			public void load(Object loadConfig,
					AsyncCallback<List<JugadorVO>> callback) {
				JugadorService.Util.getInstance().obtenerJugadores(callback);
			}
		};
		BeanModelReader reader = new BeanModelReader();

		// loader and store
		ListLoader<ListLoadResult<ModelData>> loader = new BaseListLoader<ListLoadResult<ModelData>>(
				proxy, reader);
		ListStore<BeanModel> store = new ListStore<BeanModel>(loader);

		loader.load();

		// column model
		List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
		columns.add(new ColumnConfig("idJugador", "ID", 30));
		columns.add(new ColumnConfig("nombres", "Nombres", 120));
		columns.add(new ColumnConfig("apellidos", "Apellidos", 60));
		columns.add(new ColumnConfig("codPosicion", "Posicion", 60));
		ColumnModel cm = new ColumnModel(columns);

		grid = new Grid<BeanModel>(store, cm);
		grid.setAutoExpandColumn("nombres");
		grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
		
		grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				
				BeanModelFactory factory = BeanModelLookup.get().getFactory(JugadorVO.class);
				BeanModel beanModel = factory.createModel(jugador);
				beanModel= (BeanModel) se.getSelection().get(0);
				
				jugador = beanModel.getBean();
				
				String nombreCompleto = (String) se.getSelection().get(0).get("nombres");
				nombreCompleto += " "+(String) se.getSelection().get(0).get("apellidos");

				status.setText(nombreCompleto);
			}
		});
	}

}
